/*Copyright (C) 2009 - 2011 MASSART GAUTHIER and Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

#define NOMBRE_CHOIX_MENU 15
/*
** Affiche un menu simple.
**
** Exemple: afficher_menu_simple("a\nb\nc\n"); affichera:
** 1.a
** 2.b
** 3.c
*/
int afficher_menu_simple(const char *contenu_menu) {
	return afficher_menu(contenu_menu, NULL, NULL);
}

/*
** Affiche un menu de jeu
**
** Exemple: afficher_menu_jeu("jouer\nManuel\nQuitter\n", "JEU") affichera:
**                      JEU
**
** 1.jouer
** 2.Manuel
** 3.Quitter
*/
int afficher_menu_jeu(const char *contenu_menu, const char *titre_jeu) {
	return afficher_menu(contenu_menu, NULL, titre_jeu);
}

/*
** Affiche un menu simple avec un titre
**
** Exemple: afficher_menu_titre("a\nb\nc\n", "Choisissez votre pion:")
** affichera:
** Choisissez votre pion:
** 1.a
** 2.b
** 3.c
*/
int afficher_menu_titre(const char *contenu_menu, const char *titre_menu) {
	return afficher_menu(contenu_menu, titre_menu, NULL);
}

void afficher_fleches_menu(short menu_actuel, short nombre_choix, bool animation) {
	bool fleche_gauche = false;
	bool fleche_droite = false;
	short x, y, debut_cadre;

	if(animation) {
		debut_cadre = DEFAULT_SCREEN_SIZE_X - 17;
	}
	else {
		debut_cadre = DEFAULT_SCREEN_SIZE_X - 22;
	}

	getyx(stdscr, y, x);

	if(nombre_choix > NOMBRE_CHOIX_MENU) {
		if(menu_actuel == 1) {
			fleche_droite = true;
			fleche_gauche = false;
		}
		else if(menu_actuel > 1 && menu_actuel < (nombre_choix - menu_actuel * NOMBRE_CHOIX_MENU)) {
			fleche_droite = true;
			fleche_gauche = true;
		}
		else {
			fleche_droite = false;
			fleche_gauche = true;
		}

		CSLP_ColorText(COLOR_YELLOW);
		mvaddstr(34 , debut_cadre, "┌───────────────┐");

		if(animation) {
			move(34, 95);
			decaler(5, 15, false);
		}

		mvaddstr(35, debut_cadre, "│     MENUS     │");

		if(animation) {
			move(35, 95);
			decaler(5, 15, false);
		}

		mvprintw(36, debut_cadre, "│     %d / %d     │", menu_actuel, (nombre_choix / NOMBRE_CHOIX_MENU + 1));

		if(animation) {
			move(36, 95);
			decaler(5, 15, false);
		}

		mvaddstr(37, debut_cadre, "├───────────────┤");

		if(animation) {
			move(37, 95);
			decaler(5, 15, false);
		}

		mvaddstr(38, debut_cadre, "│");

		if(fleche_gauche) {
			CSLP_ColorText(COLOR_WHITE);
		}
		else {
			CSLP_ColorText(COLOR_BLACK);
		}

		addstr("  ◄────");

		CSLP_ColorText(COLOR_YELLOW);
		mvaddch(38, debut_cadre + 8, '/');

		if(fleche_droite) {
			CSLP_ColorText(COLOR_WHITE);
		}
		else {
			CSLP_ColorText(COLOR_BLACK);
		}

		addstr("────►  ");
		CSLP_ColorText(COLOR_YELLOW);
		addstr("│");

		if(animation) {
			move(38, 95);
			decaler(5, 15, false);
		}

		mvaddstr(39, debut_cadre, "└───────────────┘");

		if(animation) {
			move(39, 95);
			decaler(5, 15, false);
		}
	}

	move(y + 1, x);
}

/*
** Permet l'affichage des entrés du menu pour les différents
** type de menus
*/
void afficher_contenu_menu(char **menus, short menu_actuel, short choix, short *nombre_choix, bool animation) {
	int i = 0;
	int j = 0;
	int k = 1;
	int debut_affichage = ((menu_actuel * NOMBRE_CHOIX_MENU) - NOMBRE_CHOIX_MENU) + 1;
	int fin_affichage = (menu_actuel * NOMBRE_CHOIX_MENU) + 1;
	int espace_sous_menu = 0;
	char sous_menu[110];
	char dernier_sous_menu[110];
	*nombre_choix = 0;

	vider_buffer();

	while(menus[i] != NULL) {

		if(CSLP_PollChar()) {																/*Stop l'animation si une touche est pressée*/
			animation = false;
		}

		if(menus[i][0] == '*') {   											  /*affichage d'un sous menu*/

			j = 0;

			while(j != 110) {                                /*Vide sous_menu*/
				sous_menu[j] = '\0';
				j++;
			}

			j = 0;

			do {                                             /*Décale de un caractère l'entrée pour que '*' ne soit pas affiché*/
				sous_menu[j] = menus[i][j+1];
				j++;
			}
			while(menus[i][j+1] != '\0');

			strcpy(dernier_sous_menu, sous_menu);

			if(k < fin_affichage && k >= debut_affichage) {
				CSLP_ColorText(COLOR_RED);

				if(animation) {
					addch('\n');
				}
				else {
					addstr("\n ");
				}

				afficher_char_bullet(1);
				CSLP_ColorText(CT);
				addstr(sous_menu);
				addch('\n');

				if(animation) {
					goto_previous_line();
					decaler(1, 65, true);
					goto_next_line();
				}
			}

			i++;
			espace_sous_menu = 0;
		}
		else {                      											 /*affiche un choix*/
			if(k < fin_affichage && k >= debut_affichage) {
				if(espace_sous_menu > 1 && k == (NOMBRE_CHOIX_MENU * menu_actuel - (NOMBRE_CHOIX_MENU - 1)) && dernier_sous_menu != NULL) {
					CSLP_ColorText(COLOR_RED);

					if(animation) {
						addch('\n');
					}
					else {
						addstr("\n ");
					}

					afficher_char_bullet(1);
					CSLP_ColorText(CT);
					addstr(dernier_sous_menu);
					addch('\n');

					if(animation) {
						goto_previous_line();
						decaler(1, 65, true);
						goto_next_line();
					}
				}

				if(type_menu == 1) {
					CSLP_ColorText(COLOR_RED);

					if(animation) {
						printw("%i.", k);
					}
					else {
						printw("   %i.", k);
					}
				}

				if(type_menu == 2) {
					if(choix == k) {
						CSLP_ColorText(COLOR_RED);

						if(animation) {
							addstr(" →");
						}
						else {
							addstr("    →");
						}

						CSLP_Color(CTS, CBS);
					}
					else {
						CSLP_ColorText(CT);

						if(animation) {
							addstr("  ");
						}
						else {
							addstr("     ");
						}
					}
				}
				else {
					CSLP_ColorText(CT);
				}

				addstr(menus[i]);

				if(type_menu == 2) {
					if(choix == k) {
						CSLP_Color(COLOR_RED, COLOR_BLACK);
						addstr("←");
					}
				}

				addch('\n');

				if(animation) {
					goto_previous_line();
					decaler(3, 20, true);
					goto_next_line();
				}
			}

			i++;
			k++;
			espace_sous_menu ++;
			*nombre_choix += 1;
		}
	}

	afficher_fleches_menu(menu_actuel, *nombre_choix, animation);
}

/*
** Permet d'afficher une chaine de caractère formatée sous la forme d'un
** menu.
*/
int afficher_menu(const char *contenu_menu, const char *titre_menu, const char *titre_jeu) {
	short choix = 1;
	short nombre_choix = 0;
	short menu_actuel = 1;
	short x, y;
	int i = 0;
	char **menus = split("\n", contenu_menu);/*Place chaque entrée du menu dans une case du tableau "menus" */
	bool reafficher_menu = true, animation;

	if(animation_menu) {
		animation = true;
	}
	else {
		animation = false;
	}

	if(menus[0][0] == '\0') {
		/*si le contenu du menu est vide*/
		Log(LOG_DEFAULT, "Erreur, le contenu du menu est vide.");
		/*on ferme le programme*/
		exit(-1);
	}

	if(titre_jeu) {
		afficher_titre(titre_jeu);
		addch('\n');
	}

	if(titre_menu) {
		CSLP_ColorText(CT);
		addch(' ');
		addstr(titre_menu);
		addch('\n');
	}

	getyx(stdscr, y, x);

	if(type_menu == 1) {  /*Menu normale*/
		bool choixValide = false;

		while(!choixValide) {
			if(reafficher_menu) {
				afficher_contenu_menu(menus, menu_actuel, choix, &nombre_choix, animation);
				reafficher_menu = false;
				animation = false;
			}

			CSLP_ColorText(CT);
			addstr(" Votre choix : ");
			refresh();
			vider_buffer();
			choix = lire_menu();

			if(choix > ((menu_actuel * NOMBRE_CHOIX_MENU) - NOMBRE_CHOIX_MENU) && choix <= nombre_choix && choix <= (menu_actuel * NOMBRE_CHOIX_MENU)) {
				choixValide = true;
				jouer_son(DING);
			}
			else if((choix == touche_droite  || choix == touche_gauche)) {
				if((choix == touche_droite && menu_actuel <= (nombre_choix - menu_actuel * NOMBRE_CHOIX_MENU)) || (choix == touche_gauche && menu_actuel > 1)) {
					move(y, 0);

					i = 0;

					while(i != (40 - y)) {
						deleteln();

						if(animation_menu) {
							refresh();
							CSLP_Sleep(10);
						}

						i++;
					}

					if(choix == touche_droite)
						menu_actuel++;
					else
						menu_actuel--;

					reafficher_menu = true;

					if(animation_menu) {
						animation = true;
					}
				}
				else {
					clear_line();
				}
			}
			else {
				clear_line();
			}
		}/* fin de while(!choixValide)*/
	} /*fin de if(type_menu == 1)*/
	else if(type_menu == 2) { /*Menu avec flèches*/
		int k = 0;
		save_cursor_pos();
		vider_buffer();

		while(k != KEY_RETURN) {
			restore_cursor_pos();
			afficher_contenu_menu(menus, menu_actuel, choix, &nombre_choix, animation);
			animation = false;
			k = getch();

			if(k == touche_haut) {  /*Dans le cas où on veut monter dans le menu*/
				if(choix > menu_actuel * NOMBRE_CHOIX_MENU - (NOMBRE_CHOIX_MENU - 1)) { /*si on n'est pas déjà au début*/
					/*déplacement du choix*/
					choix--;
				}
			}
			else if(k == touche_bas) {
				if(choix < nombre_choix && choix < menu_actuel * NOMBRE_CHOIX_MENU) { /*si on est pas déjà en fin de menu*/
					/*déplacement du choix*/
					choix++;
				}
			}
			else if((k == touche_droite  || k == touche_gauche)) {
				if((k == touche_droite && menu_actuel <= (nombre_choix - menu_actuel * NOMBRE_CHOIX_MENU)) || (k == touche_gauche && menu_actuel > 1)) {
					move(y, 0);

					i = 0;

					while(i != (40 - y)) {
						deleteln();
						refresh();
						CSLP_Sleep(10);
						i++;
					}

					if(k == touche_droite)
						menu_actuel++;
					else
						menu_actuel--;

					if(animation_menu) {
						animation = true;
					}

					choix = ((menu_actuel * NOMBRE_CHOIX_MENU) - (NOMBRE_CHOIX_MENU - 1)); /*Place le curseur au début du menu*/
				}
			}
		}

		jouer_son(DING);
	}/*fin de else if(type_menu == 2)*/
	else {
		clear();
		afficher_titre("/!\\ ERREUR /!\\");
		addstr("\n\nLa variable du menu est corrompu !\n");
		refresh();
		afficher_temps(10, 'm', 1, 2000);
		addstr("\n\nSuppression des configurations : ");
		remove(CONFIG_FILENAME);
		addstr(" OK\n");
		addstr("\n\nVeuillez redémarrer le jeu.\n");
		refresh();
		afficher_temps(20, 'm', 1, 1500);

		unsplit(menus);

		exit(0);
	}

	unsplit(menus);
	vider_buffer();
	return choix;
}
